github.com/git-lfs/git-lfs@v2.5.2+incompatible/commands/command_untrack.go (about)

     1  package commands
     2  
     3  import (
     4  	"bufio"
     5  	"io/ioutil"
     6  	"os"
     7  	"strings"
     8  
     9  	"github.com/spf13/cobra"
    10  )
    11  
    12  // untrackCommand takes a list of paths as an argument, and removes each path from the
    13  // default attributes file (.gitattributes), if it exists.
    14  func untrackCommand(cmd *cobra.Command, args []string) {
    15  	if cfg.LocalGitDir() == "" {
    16  		Print("Not a git repository.")
    17  		os.Exit(128)
    18  	}
    19  	if cfg.LocalWorkingDir() == "" {
    20  		Print("This operation must be run in a work tree.")
    21  		os.Exit(128)
    22  	}
    23  
    24  	installHooks(false)
    25  
    26  	if len(args) < 1 {
    27  		Print("git lfs untrack <path> [path]*")
    28  		return
    29  	}
    30  
    31  	data, err := ioutil.ReadFile(".gitattributes")
    32  	if err != nil {
    33  		return
    34  	}
    35  
    36  	attributes := strings.NewReader(string(data))
    37  
    38  	attributesFile, err := os.Create(".gitattributes")
    39  	if err != nil {
    40  		Print("Error opening .gitattributes for writing")
    41  		return
    42  	}
    43  	defer attributesFile.Close()
    44  
    45  	scanner := bufio.NewScanner(attributes)
    46  
    47  	// Iterate through each line of the attributes file and rewrite it,
    48  	// if the path was meant to be untracked, omit it, and print a message instead.
    49  	for scanner.Scan() {
    50  		line := scanner.Text()
    51  		if !strings.Contains(line, "filter=lfs") {
    52  			attributesFile.WriteString(line + "\n")
    53  			continue
    54  		}
    55  
    56  		path := strings.Fields(line)[0]
    57  		if removePath(path, args) {
    58  			Print("Untracking %q", unescapeAttrPattern(path))
    59  		} else {
    60  			attributesFile.WriteString(line + "\n")
    61  		}
    62  	}
    63  }
    64  
    65  func removePath(path string, args []string) bool {
    66  	withoutCurrentDir := trimCurrentPrefix(path)
    67  	for _, t := range args {
    68  		if withoutCurrentDir == escapeAttrPattern(trimCurrentPrefix(t)) {
    69  			return true
    70  		}
    71  	}
    72  
    73  	return false
    74  }
    75  
    76  func init() {
    77  	RegisterCommand("untrack", untrackCommand, nil)
    78  }