mirror of https://github.com/go-gitea/gitea.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
2.2 KiB
91 lines
2.2 KiB
// Copyright 2020 The Gitea Authors. All rights reserved. |
|
// SPDX-License-Identifier: MIT |
|
|
|
package git |
|
|
|
import ( |
|
"strconv" |
|
) |
|
|
|
// EntryMode the type of the object in the git tree |
|
type EntryMode int |
|
|
|
// There are only a few file modes in Git. They look like unix file modes, but they can only be |
|
// one of these. |
|
const ( |
|
// EntryModeNoEntry is possible if the file was added or removed in a commit. In the case of |
|
// when adding the base commit doesn't have the file in its tree, a mode of 0o000000 is used. |
|
EntryModeNoEntry EntryMode = 0o000000 |
|
|
|
EntryModeBlob EntryMode = 0o100644 |
|
EntryModeExec EntryMode = 0o100755 |
|
EntryModeSymlink EntryMode = 0o120000 |
|
EntryModeCommit EntryMode = 0o160000 |
|
EntryModeTree EntryMode = 0o040000 |
|
) |
|
|
|
// String converts an EntryMode to a string |
|
func (e EntryMode) String() string { |
|
return strconv.FormatInt(int64(e), 8) |
|
} |
|
|
|
// IsSubModule if the entry is a submodule |
|
func (e EntryMode) IsSubModule() bool { |
|
return e == EntryModeCommit |
|
} |
|
|
|
// IsDir if the entry is a sub dir |
|
func (e EntryMode) IsDir() bool { |
|
return e == EntryModeTree |
|
} |
|
|
|
// IsLink if the entry is a symlink |
|
func (e EntryMode) IsLink() bool { |
|
return e == EntryModeSymlink |
|
} |
|
|
|
// IsRegular if the entry is a regular file |
|
func (e EntryMode) IsRegular() bool { |
|
return e == EntryModeBlob |
|
} |
|
|
|
// IsExecutable if the entry is an executable file (not necessarily binary) |
|
func (e EntryMode) IsExecutable() bool { |
|
return e == EntryModeExec |
|
} |
|
|
|
func ParseEntryMode(mode string) EntryMode { |
|
switch mode { |
|
case "000000": |
|
return EntryModeNoEntry |
|
case "100644": |
|
return EntryModeBlob |
|
case "100755": |
|
return EntryModeExec |
|
case "120000": |
|
return EntryModeSymlink |
|
case "160000": |
|
return EntryModeCommit |
|
case "040000": |
|
return EntryModeTree |
|
default: |
|
// git uses 040000 for tree object, but some users may get 040755 from non-standard git implementations |
|
m, _ := strconv.ParseInt(mode, 8, 32) |
|
modeInt := EntryMode(m) |
|
switch modeInt & 0o770000 { |
|
case 0o040000: |
|
return EntryModeTree |
|
case 0o160000: |
|
return EntryModeCommit |
|
case 0o120000: |
|
return EntryModeSymlink |
|
case 0o100000: |
|
if modeInt&0o777 == 0o755 { |
|
return EntryModeExec |
|
} |
|
return EntryModeBlob |
|
default: |
|
return EntryModeNoEntry |
|
} |
|
} |
|
}
|
|
|