func resolveGitDirFromCurrentDir() (string, string, error) { // Get root of the git working dir gitDir, err := git.GitDir() if err != nil { return "", "", err } // Allow this to fail, will do so if GIT_DIR isn't set but GIT_WORK_TREE is rel // Dealt with by parent rootDir, _ := git.RootDir() return rootDir, gitDir, nil }
// lockPaths relativizes the given filepath such that it is relative to the root // path of the repository it is contained within, taking into account the // working directory of the caller. // // If the root directory, working directory, or file cannot be // determined/opened, an error will be returned. If the file in question is // actually a directory, an error will be returned. Otherwise, the cleaned path // will be returned. // // For example: // - Working directory: /code/foo/bar/ // - Repository root: /code/foo/ // - File to lock: ./baz // - Resolved path bar/baz func lockPath(file string) (string, error) { repo, err := git.RootDir() if err != nil { return "", err } wd, err := os.Getwd() if err != nil { return "", err } abs := filepath.Join(wd, file) path := strings.TrimPrefix(abs, repo) if stat, err := os.Stat(abs); err != nil { return "", err } else { if stat.IsDir() { return "", fmt.Errorf("lfs: cannot lock directory: %s", file) } return path[1:], nil } }