/
index.go
98 lines (83 loc) · 2.52 KB
/
index.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//
// Copyright © 2016-2017 Ikey Doherty <ikey@solus-project.com>
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package builder
import (
"errors"
"fmt"
log "github.com/Sirupsen/logrus"
"github.com/solus-project/libosdev/disk"
"os"
"path/filepath"
)
var (
// ErrCannotContinue is a stock error return
ErrCannotContinue = errors.New("Index cannot continue")
// IndexBindTarget is where we always mount the repo
IndexBindTarget = "/hostRepo/Index"
)
// Index will attempt to index the given directory
func (p *Package) Index(notif PidNotifier, dir string, overlay *Overlay) error {
log.WithFields(log.Fields{
"profile": overlay.Back.Name,
}).Debug("Beginning indexer")
mman := disk.GetMountManager()
ChrootEnvironment = SaneEnvironment("root", "/root")
// Check the source exists first!
if !PathExists(dir) {
log.WithFields(log.Fields{
"dir": dir,
}).Error("Directory does not exist")
return ErrCannotContinue
}
// Indexer will always create new dirs..
if err := overlay.CleanExisting(); err != nil {
return err
}
if err := p.ActivateRoot(overlay); err != nil {
return err
}
// Create the target
target := filepath.Join(overlay.MountPoint, IndexBindTarget[1:])
if err := os.MkdirAll(target, 00755); err != nil {
log.WithFields(log.Fields{
"dir": target,
"error": err,
}).Error("Cannot create bind target")
return err
}
log.WithFields(log.Fields{
"dir": dir,
}).Debug("Bind mounting directory for indexing")
if err := mman.BindMount(dir, target); err != nil {
log.WithFields(log.Fields{
"dir": target,
"error": err,
}).Error("Cannot bind mount directory")
return err
}
// Ensure it gets cleaned up
overlay.ExtraMounts = append(overlay.ExtraMounts, target)
log.Debug("Now indexing")
command := fmt.Sprintf("cd %s; %s", IndexBindTarget, eopkgCommand("eopkg index --skip-signing ."))
if err := ChrootExec(notif, overlay.MountPoint, command); err != nil {
log.WithFields(log.Fields{
"error": err,
"dir": dir,
}).Error("Indexing failed")
return err
}
return nil
}