-
Notifications
You must be signed in to change notification settings - Fork 0
/
checkfornew.groovy
113 lines (107 loc) · 4.38 KB
/
checkfornew.groovy
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
@Grab(group = 'org.codehaus.groovy.modules.http-builder', module = 'http-builder', version = '0.7.1')
import groovyx.net.http.RESTClient
import java.text.SimpleDateFormat
import org.artifactory.repo.Repositories;
/**
* Intercepts a request for a remote repository, if the item is cached,
* it checks the remote source for changes (using a HEAD request). If
* a change is detected, deletes the locally cached file and then proceeds
* with the request.
*
* @author Arturo Aparicio
*/
download {
// The names of all the remote repositories to apply this plugin to
def remoteRepoNames = ["repos", "other"]
// Constants
def REMOTE = "remote"
// WARNING - SECURITY IMPLICATIONS
// Allows users that don't have the delete permission the ability to delete
// the file if it is going to be replaced with a newer version
def ALLOW_DELETE_WITHOUT_USER_PERMISSION = true
beforeDownloadRequest { request, repoPath ->
log.debug "new beforeDownloadRequest"
// Only intercept the download to a specific set of remote repos
def repoName = repoPath.getRepoKey()
if (remoteRepoNames.contains(repoName))
{
log.debug "Repository is in list of repos to apply plugin to."
// Check if the repo path exists, if it does NOT, no need to
// check for a new version.
if (!repositories.exists(repoPath)) {
log.debug "Path does not exist - No further processing required."
return
}
// Check if the repository is a valid remote repo
def repoConfig = repositories.getRepositoryConfiguration(repoName)
if (repoConfig == null) {
log.info "Error getting configuration for $repoName. \
Check if the repository exists."
return
}
if (!repoConfig.getType().equals(REMOTE)) {
log.info "Repository $repoName must be a remote repository."
return
}
// Check if there is a newer version, if there is,
// delete the current verion
if (newVersionExists(repoConfig, repoPath))
{
log.debug "Newer version exist, deleting cached artifact."
if (ALLOW_DELETE_WITHOUT_USER_PERMISSION)
{
asSystem {
log.debug "Performing delete as system."
repositories.delete(repoPath)
}
} else {
repositories.delete(repoPath)
}
}
}
}
}
/**
* Determines if the cached artifact is the same as that in the remote.
*
* @param repoPath The repository and fragment URL combined
* @return true if and only if the cached artifact differs from the remote
*/
private def newVersionExists(repoConfig, repoPath) {
def remoteURL = repoConfig.getUrl()
if (remoteURL.charAt(remoteURL.length() - 1) != '/')
remoteURL += "/"
def path = repoPath.getPath()
def itemInfo = repositories.getItemInfo(repoPath)
if (itemInfo.isFolder())
{
log.info "Path '$path' is a folder - Plugin does not apply - No further processing."
return false
}
// Comparison logic goes here
def createdLocally = itemInfo.getCreated()
def client = new RESTClient(remoteURL)
try {
def response = client.head path: path
def lastModified = response.headers['Last-Modified']
// The remote repository is not sending a Last-Modified tag
if (lastModified == null) {
log.debug "Last-Modified header does not exist!"
// Change to return true if you want to retrieve it even
// if it has not changed.
return false
}
// Get a timestamp
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz")
Date d = format.parse(lastModified.getValue().toString())
long lastModifiedTimestamp = d.getTime()
log.debug "Comparing: lastModifiedTimestamp($lastModifiedTimestamp) > createdLocally($createdLocally)"
// The remote resource has been modified after it was originally created.
if (lastModifiedTimestamp > createdLocally)
return true
} catch( ex ) {
log.error "Error: $ex"
// Add error handling for a more robust implementation
}
return false
}