Skip to content

Commit 9b47722

Browse files
committed
Fix file parts are not joined when resume
1 parent 8010386 commit 9b47722

File tree

4 files changed

+48
-27
lines changed

4 files changed

+48
-27
lines changed

http.go

+39-25
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,9 @@ func partCalculate(par int64, len int64, url string) []Part {
123123
// Padding 0 before path name as filename will be sorted as string
124124
fname := fmt.Sprintf("%s.part%06d", file, j)
125125
path := filepath.Join(folder, fname) // ~/.hget/download-file-name/part-name
126-
ret[j] = Part{Url: url, Path: path, RangeFrom: from, RangeTo: to}
126+
ret[j] = Part{Index: j, Url: url, Path: path, RangeFrom: from, RangeTo: to}
127127
}
128+
128129
return ret
129130
}
130131

@@ -134,25 +135,31 @@ func (d *HttpDownloader) Do(doneChan chan bool, fileChan chan string, errorChan
134135
var barpool *pb.Pool
135136
var err error
136137

137-
if DisplayProgressBar() {
138-
bars = make([]*pb.ProgressBar, 0)
139-
for i, part := range d.parts {
140-
newbar := pb.New64(part.RangeTo - part.RangeFrom).SetUnits(pb.U_BYTES).Prefix(color.YellowString(fmt.Sprintf("%s-%d", d.file, i)))
141-
bars = append(bars, newbar)
138+
for _, p := range d.parts {
139+
140+
if p.RangeTo <= p.RangeFrom {
141+
fileChan <- p.Path
142+
stateSaveChan <- Part{
143+
Index: p.Index,
144+
Url: d.url,
145+
Path: p.Path,
146+
RangeFrom: p.RangeFrom,
147+
RangeTo: p.RangeTo,
148+
}
149+
150+
continue
151+
}
152+
153+
var bar *pb.ProgressBar
154+
155+
if DisplayProgressBar() {
156+
bar = pb.New64(p.RangeTo - p.RangeFrom).SetUnits(pb.U_BYTES).Prefix(color.YellowString(fmt.Sprintf("%s-%d", d.file, p.Index)))
157+
bars = append(bars, bar)
142158
}
143-
barpool, err = pb.StartPool(bars...)
144-
FatalCheck(err)
145-
}
146159

147-
for i, p := range d.parts {
148160
ws.Add(1)
149-
go func(d *HttpDownloader, loop int64, part Part) {
161+
go func(d *HttpDownloader, bar *pb.ProgressBar, part Part) {
150162
defer ws.Done()
151-
var bar *pb.ProgressBar
152-
153-
if DisplayProgressBar() {
154-
bar = bars[loop]
155-
}
156163

157164
var ranges string
158165
if part.RangeTo != d.len {
@@ -214,20 +221,27 @@ func (d *HttpDownloader) Do(doneChan chan bool, fileChan chan string, errorChan
214221
// interrupt download by forcefully close the input stream
215222
resp.Body.Close()
216223
<-finishDownloadChan
217-
stateSaveChan <- Part{
218-
Url: d.url,
219-
Path: part.Path,
220-
RangeFrom: current + part.RangeFrom,
221-
RangeTo: part.RangeTo,
222-
}
223224
case <-finishDownloadChan:
224225
}
225226

226-
bar.Update()
227-
bar.Finish()
228-
}(d, int64(i), p)
227+
stateSaveChan <- Part{
228+
Index: part.Index,
229+
Url: d.url,
230+
Path: part.Path,
231+
RangeFrom: current + part.RangeFrom,
232+
RangeTo: part.RangeTo,
233+
}
234+
235+
if DisplayProgressBar() {
236+
bar.Update()
237+
bar.Finish()
238+
}
239+
}(d, bar, p)
229240
}
230241

242+
barpool, err = pb.StartPool(bars...)
243+
FatalCheck(err)
244+
231245
ws.Wait()
232246
doneChan <- true
233247
barpool.Stop()

http_test.go

+7
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,22 @@ func TestPartCalculate(t *testing.T) {
1313
if len(parts) != 10 {
1414
t.Fatalf("parts length should be 10")
1515
}
16+
1617
if parts[0].Url != "http://foo.bar/file" {
1718
t.Fatalf("part url was wrong")
1819
}
20+
1921
usr, _ := user.Current()
2022
dir := filepath.Join(usr.HomeDir, dataFolder, "file/file.part000001")
2123
if parts[1].Path != dir {
2224
t.Fatalf("part path was wrong")
2325
}
26+
2427
if parts[0].RangeFrom != 0 && parts[0].RangeTo != 10 {
2528
t.Fatalf("part range was wrong")
2629
}
30+
31+
if parts[1].Index != 1 {
32+
t.Fatal("part index was wrong")
33+
}
2734
}

main.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ func main() {
6262

6363
func Execute(url string, state *State, conn int, skiptls bool) {
6464
//otherwise is hget <URL> command
65-
var err error
6665

6766
signal_chan := make(chan os.Signal, 1)
6867
signal.Notify(signal_chan,
@@ -121,7 +120,7 @@ func Execute(url string, state *State, conn int, skiptls bool) {
121120
return
122121
}
123122
} else {
124-
err = JoinFile(files, filepath.Base(url))
123+
err := JoinFile(files, filepath.Base(url))
125124
FatalCheck(err)
126125
err = os.RemoveAll(FolderOf(url))
127126
FatalCheck(err)

state.go

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ type State struct {
1616
}
1717

1818
type Part struct {
19+
Index int64
1920
Url string
2021
Path string
2122
RangeFrom int64

0 commit comments

Comments
 (0)