diff options
Diffstat (limited to 'identity/identity_actions.go')
-rw-r--r-- | identity/identity_actions.go | 125 |
1 files changed, 0 insertions, 125 deletions
diff --git a/identity/identity_actions.go b/identity/identity_actions.go deleted file mode 100644 index b58bb2d9..00000000 --- a/identity/identity_actions.go +++ /dev/null @@ -1,125 +0,0 @@ -package identity - -import ( - "fmt" - "strings" - - "github.com/pkg/errors" - - "github.com/MichaelMure/git-bug/entity" - "github.com/MichaelMure/git-bug/repository" -) - -// Fetch retrieve updates from a remote -// This does not change the local identities state -func Fetch(repo repository.Repo, remote string) (string, error) { - return repo.FetchRefs(remote, "identities") -} - -// Push update a remote with the local changes -func Push(repo repository.Repo, remote string) (string, error) { - return repo.PushRefs(remote, "identities") -} - -// Pull will do a Fetch + MergeAll -// This function will return an error if a merge fail -func Pull(repo repository.ClockedRepo, remote string) error { - _, err := Fetch(repo, remote) - if err != nil { - return err - } - - for merge := range MergeAll(repo, remote) { - if merge.Err != nil { - return merge.Err - } - if merge.Status == entity.MergeStatusInvalid { - return errors.Errorf("merge failure: %s", merge.Reason) - } - } - - return nil -} - -// MergeAll will merge all the available remote identity -func MergeAll(repo repository.ClockedRepo, remote string) <-chan entity.MergeResult { - out := make(chan entity.MergeResult) - - go func() { - defer close(out) - - remoteRefSpec := fmt.Sprintf(identityRemoteRefPattern, remote) - remoteRefs, err := repo.ListRefs(remoteRefSpec) - - if err != nil { - out <- entity.MergeResult{Err: err} - return - } - - for _, remoteRef := range remoteRefs { - refSplit := strings.Split(remoteRef, "/") - id := entity.Id(refSplit[len(refSplit)-1]) - - if err := id.Validate(); err != nil { - out <- entity.NewMergeInvalidStatus(id, errors.Wrap(err, "invalid ref").Error()) - continue - } - - remoteIdentity, err := read(repo, remoteRef) - - if err != nil { - out <- entity.NewMergeInvalidStatus(id, errors.Wrap(err, "remote identity is not readable").Error()) - continue - } - - // Check for error in remote data - if err := remoteIdentity.Validate(); err != nil { - out <- entity.NewMergeInvalidStatus(id, errors.Wrap(err, "remote identity is invalid").Error()) - continue - } - - localRef := identityRefPattern + remoteIdentity.Id().String() - localExist, err := repo.RefExist(localRef) - - if err != nil { - out <- entity.NewMergeError(err, id) - continue - } - - // the identity is not local yet, simply create the reference - if !localExist { - err := repo.CopyRef(remoteRef, localRef) - - if err != nil { - out <- entity.NewMergeError(err, id) - return - } - - out <- entity.NewMergeNewStatus(id, remoteIdentity) - continue - } - - localIdentity, err := read(repo, localRef) - - if err != nil { - out <- entity.NewMergeError(errors.Wrap(err, "local identity is not readable"), id) - return - } - - updated, err := localIdentity.Merge(repo, remoteIdentity) - - if err != nil { - out <- entity.NewMergeInvalidStatus(id, errors.Wrap(err, "merge failed").Error()) - return - } - - if updated { - out <- entity.NewMergeUpdatedStatus(id, localIdentity) - } else { - out <- entity.NewMergeNothingStatus(id) - } - } - }() - - return out -} |